/*
 * File name: drp.h
 * Description: Header file for the Data Ring Protection module.
 * This module provides a mechanism to manage a fixed-size array of data blocks,
 * protecting and unprotecting them as data is stored and consumed.
 * Author: <Your Name>
 * Date: <Creation Date>
 *
 * Note: This file is part of the <Your Project Name> project and is licensed
 * under <Your License Type>.
 */

#ifndef _DATA_RING_PROTECTION_H_
#define _DATA_RING_PROTECTION_H_

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

// // 数据块定义，具有固定长度的数据数组
// #define DATA_LENGTH 1024  // 示例数据长度，根据需要定义

// DataBlock 结构体定义
typedef struct {
    uint8_t *data;           // 动态分配的数据缓冲区
    size_t initialSize;       // 初始分配的数据缓冲区大小
    size_t actualSize;        // 实际存储数据的长度
    bool is_protected;        // 单个数据块的保护状态
} DataBlock;

// DataRingProtection 结构体定义
typedef struct {
    DataBlock *blocks;       // 数据块数组
    size_t capacity;          // 总容量（数据块数量）
    size_t protected_count;   // 已保护的数据块数量
} DataRingProtection;

// 前向声明 DataRingProtection 结构体
// typedef struct DataRingProtection DataRingProtection;

#ifdef __cplusplus
extern "C" {
#endif

// // 创建和初始化 DataRingProtection 实例
// DataRingProtection* DataRingProtection_Create(size_t capacity);

// 创建 DataRingProtection 实例的函数声明
DataRingProtection* DataRingProtection_Create(size_t capacity, size_t dataLength);

// 销毁 DataRingProtection 实例并释放内存
bool DataRingProtection_Destroy(DataRingProtection *drp);

// 存储数据并返回存储区域的指针和长度
bool DataRingProtection_StoreData(DataRingProtection *drp, const uint8_t *srcData, size_t srcLength, uint8_t **storedPointer);

// 消费数据并释放保护状态
bool DataRingProtection_ConsumeData(DataRingProtection *drp, uint8_t *pointer, uint8_t *dstData, size_t *dataLength) ;

// 获取未保护的数据区数量
size_t DataRingProtection_GetFreeSpace(DataRingProtection *drp);

// 获取已保护的数据区数量
size_t DataRingProtection_GetProtectedCount(DataRingProtection *drp);

// 清除单条保护区的保护状态
bool DataRingProtection_ClearProtection(DataRingProtection *drp, uint8_t *pointer);

// 重启初始化数据结构区
void DataRingProtection_Reset(DataRingProtection *drp);

#ifdef __cplusplus
}
#endif

#endif // _DATA_RING_PROTECTION_H_